package com.ctsi.organise.service;

import com.ctsi.commons.util.response.Page;
import com.ctsi.framework.elementui.support.TreeNode;
import com.ctsi.organise.common.constant.PartyType;
import com.ctsi.organise.common.model.Organise;
import com.ctsi.organise.common.model.Person;
import com.ctsi.organise.common.model.UserLogin;
import com.ctsi.organise.query.OrganiseQuery;
import com.ctsi.organise.query.PersonQuery;
import com.ctsi.organise.vo.*;

import java.util.List;

/**
 * @author: zhangjw
 * @Date: 2018/11/11 20:12
 * @Description: 内部组织服务接口规范
 */
public interface IOrganiseService {

    public static final String DEFAULT_ORGAN_ROOT = "root";

    /**
     * 带权限的返回组织树节点
     * @param userLogin
     * @param partyId
     * @return
     */
    List<TreeNode> getChildTreeNode(String userLogin,String partyId);

    /**
     * 带权限的返回组织下的所有子孙组织
     * @param userLogin 用户登陆ID
     * @param dataObjectType 数据对象类型
     * @param action 动作
     * @param partyId 组织ID
     * @return
     */
     List<OrganiseVO> findAllOrganisePrivileged(String userLogin, String dataObjectType,String action, String partyId);

    /**
     *  帶權限返回一组织下的所有人员
     * @param userLogin 用户登陆ID
     * @param dataObjectType 数据对象类型
     * @param action 动作
     * @param partyId 组织ID
     * @return
     */
     List<Person> findAllPersonPrivileged(String userLogin, String dataObjectType, String action, String partyId);

    /**
     * 帶權限返回一组织下的所有登录用户
     * @param userLogin 用户登陆ID
     * @param dataObjectType 数据对象类型
     * @param action 动作
     * @param partyId 组织ID
     * @return
     */
     List<UserLogin> findAllLoginUserPrivileged(String userLogin, String dataObjectType, String action, String partyId);

    /**
     * 一组织是否包含另一组织
     * @param superId 父组织ID
     * @param subId 子组织ID
     * @return
     */
     boolean isContain(String superId,String subId);

    /**
     * 根據类型返回所有的子孙组织
     * @param partyId 组织ID
     * @param partyType 组织类型
     * @return
     */
     List<Organise> findAllOrganise(String partyId, PartyType partyType);

    /**
     * 根据类型返回所有的子孙人员
     * @param partyId 组织ID
     * @param partyType 组织类型
     * @return
     */
     List<Person> findAllPerson(String partyId, PartyType partyType);

    /**
     * 根据类型返回所有的子孙登录用户
     * @param partyId 组织ID
     * @param partyType 组织类型
     * @return
     */
     List<UserLogin> findAllLoginUser(String partyId,PartyType partyType);


    /**
     * 添加组织
     * @param organise
     * @param userId
     * @param publishEvent
     */
     void addOrganise(AddOrganVO organise,String userId, boolean publishEvent);

    /**
     * 添加人员，同时添加登陆账号
     * @param personVO
     * @param userId
     * @param publishEvent
     */
     String addPersonWithAcc(AddPersonVO personVO,String userId,boolean publishEvent);

    /**
     * 组织结构分页查询
     * @param organise
     * @param start
     * @param pageSize
     * @return
     */
     Page<OrganiseVO> page(OrganiseQuery organise,String loginUserId, int start, int pageSize);

    /**
     * 带权限的返回人员
     * @param person
     * @param loginUserId
     * @param start
     * @param pageSize
     * @return
     */
     Page<PersonVO> personPageQueryPrivileged(PersonQuery person, String loginUserId, int start, int pageSize);

    /**
     * 带权限的逻辑删除
     * @param UserLogin
     * @param partyId
     */
     void logicallyDelete(String UserLogin,String partyId);

    /**
     * 带权限的编辑
     * @param userlogin
     * @param partyId
     */
     EditOrganVO editPrivileged(String userlogin, String partyId);

    /**
     * 带权限的更新
     * @param userLogin
     * @param organVO
     */
     void updatePrivileged(String userLogin,String updateBy,EditOrganVO organVO);

    /**
     * 删除用户
     * @param userLogin
     * @param partyIds
     */
     void logicallyDeletePerson(String userLogin,List<String> partyIds);

    /**
     * 物理删除人员
     * @param userlogin
     * @param partyIds
     */
     void physicDelPerson(String userlogin,List<String> partyIds);

}
